package com.eedi.org.facade;

import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * @author zybourn
 */
public interface OrgUserFacade {
    /**
     * 获取用户名称
     * 描述：
     * 当前数据库中的创建人、修改人留存的都只有用户Id；
     * 在给前端展示的时候需要增加创建人信息时，
     * 则可以使用该方法填充用户名称；
     *
     * @param userId         用户Id
     * @param fillInConsumer 填充用户名称的Consumer，如setUserName(String userName);
     */
    void fillInUserName(@Validated @NotBlank String userId, @Validated @NotNull Consumer<String> fillInConsumer);

    /**
     * 获取用户所在的部门ID
     * 描述：
     * 当前数据库中的创建人、修改人留存的都只有用户Id,根据用户Id填充用户所在部门Id
     *
     * @param userId         用户Id
     * @param fillInConsumer 填充用户所在部门Id的Consumer，如setUserDeptId(String deptId);
     */
    void fillInUserDetpId(@Validated @NotBlank String userId, @Validated @NotNull Consumer<String> fillInConsumer);

    /**
     * 获取用户名称
     * 描述：
     * 当前数据库中的创建人、修改人留存的都只有用户Id；
     * 在给前端展示的时候需要增加创建人信息时，
     * 则可以使用该方法填充用户名称；
     *
     * @param collection       完整的返回数据对象
     * @param userIdFunction   获取userId的方法，如getUserId()；
     * @param userNameFunction 填充用户名称的方法，如setUserName(String userName)；
     *                         伪代码：
     *                         for (T element : collection) {
     *                         String userId = userIdFunction.apply(element);
     *                         String username = idToUsernameMap.get(userId); // 获取用户名
     *                         if (username != null) {
     *                         userNameFunction.accept(element, username); // 设置用户名到元素中
     *                         } else {
     *                         System.out.println("未找到ID为 " + userId + " 的用户名");
     *                         }
     *                         }
     */
    <T> void fillInUserName(@Validated @NotNull Collection<T> collection, Function<T, String> userIdFunction,
                            BiConsumer<T, String> userNameFunction);

    /**
     * 获取用户ID
     * 描述：
     * 当需要通过用户登录名，来获取用户账号信息
     *
     * @param collection       完整的返回数据对象
     * @param userLoginIdFunction   获取userLoginId的方法，如getLoginUserId()；
     * @param userIdFunction 填充用户Id的方法，如setUserId(String userId)；
     *                         伪代码：
     *                         for (T element : collection) {
     *                         String userLoginId = userLoginIdFunction.apply(element);
     *                         String userId = loginIdToUserIdMap.get(userLoginId); // 获取用户Id
     *                         if (userId != null) {
     *                          userIdFunction.accept(element, userId); // 设置用户名到元素中
     *                         } else {
     *                          System.out.println("未找到登录名为 " + userLoginId + " 的用户ID");
     *                         }
     *                         }
     */
    <T> void fillInUserId(@Validated @NotNull Collection<T> collection, Function<T, String> userLoginIdFunction,
                            BiConsumer<T, String> userIdFunction);


    /**
     * 左匹配用户名称/登录账号，获取用户ID
     * @param userIdentification 用户名称
     * @return 用户ID列表
     */
    List<String> findUserIdentification(String userIdentification);

    /**
     * 填充用户登录标识
     * @param collection 集合
     * @param userIdFunction 用户id获取方法
     * @param userAccountIdFunction 填充登录账号方法
     * @param <T> 泛型
     */
    <T> void fillInUserLoginId(@Validated @NotNull Collection<T> collection, Function<T, String> userIdFunction,
                                 BiConsumer<T, String> userAccountIdFunction);
}
